package semantico;

import simbolos.Tipo;

public class Laco extends Codigo{

	Expressao expressao;
	Codigo codigo;
	int rotuloLaco; //usado para salvar o rotulo do laco para uso com comando continue
	
	public Laco(){
		expressao = null;
		codigo = null;
	}
	
	public void entrarLaco(Expressao condicao, Codigo comandos) throws SemanticoException{
		expressao = condicao;
		codigo = comandos;
		
		if(expressao.tipo != Tipo.LOGICO) montaErro(3, "");
	}
	
	/**
	 * Gera codigo de tres enderecos
	 * @param inicio - marca o inicio do codigo para o comando.
	 * @param primeiraInstrucaoApos - marca a primeira instrucao apos o codigo do comando.
	 * @throws SemanticoException 
	 */
	public void gerar(int inicio, int primeiraInstrucaoApos) throws SemanticoException{
		after = primeiraInstrucaoApos; //guarda o rotulo da primeira instrucao apos o laco
		expressao.desviar(0, primeiraInstrucaoApos); //entra no laco se a condicao for verdadeira
		int rotulo = novoRotulo(); //rotulo para 'enquanto'
		rotuloLaco = rotulo; //salva o rotulo para o 'enquanto'
		emitirRotulos(rotulo);
		codigo.gerar(rotulo, inicio);
		emitirCodigo("goto L" + inicio);
	}
}
